package es.udc.fbellas.j2ee.tiendaweb.model.detallespedido.DAO;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import es.udc.fbellas.j2ee.tiendaweb.model.detallespedido.TO.DetallesPedidoTO;
import es.udc.fbellas.j2ee.util.exceptions.InstanceNotFoundException;
import es.udc.fbellas.j2ee.util.exceptions.InternalErrorException;
import es.udc.fbellas.j2ee.util.sql.GeneralOperations;

/**
 * An implementation of <code>SQLAccountDAO</code> for databases providing
 * counter columns with JDBC 3 drivers.
 */
public class SQLDetallesPedidoDAO {

//
//crea unos nuevos detalles de pedido
//

	public DetallesPedidoTO create(Connection connection, DetallesPedidoTO detallesPedidoTO) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                
            /* Create "preparedStatement". */
            String queryString = "INSERT INTO DETALLESPEDIDO" +
                " (FECHA, NUMTARJETA, ESTADO, LOGIN, IDDIR) VALUES (?,?,?,?,?)";
            preparedStatement = connection.prepareStatement(queryString,
                Statement.RETURN_GENERATED_KEYS);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setDate(i++,
				(Date) detallesPedidoTO.getFecha());
            preparedStatement.setInt(i++,
				(int) detallesPedidoTO.getNumTarjeta());
            preparedStatement.setString(i++,
				 detallesPedidoTO.getEstado());
            preparedStatement.setString(i++,
				detallesPedidoTO.getLoginUsuario());
            preparedStatement.setInt(i++,
				(int) detallesPedidoTO.getIdDir());

                        
            /* Execute query. */
            int insertedRows = preparedStatement.executeUpdate();
        
            if (insertedRows == 0) {
                throw new SQLException("No se ha podido anhadir los detalles de pedido");
            }

            if (insertedRows > 1) {
                throw new SQLException("Tupla duplicada en la tabla DETALLESPEDIDO");
            }
            
            /* Get account identifier. */
            resultSet = preparedStatement.getGeneratedKeys();

            if (!resultSet.next()) {
                throw new InternalErrorException(new SQLException(
                    "JDBC driver did not return generated key."));
            }

			int identificador = resultSet.getInt(1);
            
            /* Return the value object. */
            return new DetallesPedidoTO(identificador, detallesPedidoTO.getFecha(), detallesPedidoTO.getNumTarjeta(), detallesPedidoTO.getEstado(), detallesPedidoTO.getLoginUsuario(), detallesPedidoTO.getIdDir());
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }




//
// saber si existe unos detalles de pedido a partir del identificador de pedido
//

    public boolean exists(Connection connection, int idPedido) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {

            /* Create "preparedStatement". */
            String queryString = "SELECT IDPEDIDO FROM DETALLESPEDIDO WHERE IDPEDIDO = ?";
            preparedStatement = connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setLong(i++, idPedido);
            
            /* Execute query. */
            resultSet = preparedStatement.executeQuery();

            return resultSet.next();
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }



//
// encontrar unos detalles de pedido a partir del identificador del pedido
//

    public DetallesPedidoTO find(Connection connection, int idPedido) 
        throws InternalErrorException {
        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
    
        try {
                

            /* Create "preparedStatement". */
            String queryString = "SELECT IDPEDIDO, FECHA, NUMTARJETA, ESTADO, LOGIN, IDDIR FROM DETALLESPEDIDO WHERE IDPEDIDO = ?";
            preparedStatement = connection.prepareStatement(queryString);    
            
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++, 
                idPedido);
                                    
            /* Execute query. */
			resultSet = preparedStatement.executeQuery();

            if (!resultSet.next()) {
                throw new InternalErrorException(new SQLException(
                    "No hay ningun detalle de pedido con ese identificador."));
            }

			/* get result */
			i = 1;
			int id = resultSet.getInt(i++);
			Date fecha = resultSet.getDate(i++);
			long numTarjeta = resultSet.getLong(i++);
			String estado = resultSet.getString(i++);
			String login = resultSet.getString(i++);
			int idDir = resultSet.getInt(i++);
			 

			return new DetallesPedidoTO(id, fecha, numTarjeta, estado, login, idDir);
        
        } catch (SQLException e) {
            throw new InternalErrorException(e);
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
			GeneralOperations.closeResultSet(resultSet);
        }
        
    }

    
    
/*    
    public void update(Connection connection, DetallesPedidoTO detallesTO) 
        throws InstanceNotFoundException, InternalErrorException {
        
        PreparedStatement preparedStatement = null;

        try {

             Create "preparedStatement". 
            String queryString = "UPDATE DETALLESPEDIDO" +
                " SET ESTADO = ? WHERE IDPEDIDO = ?";
            preparedStatement = connection.prepareStatement(queryString);
            
             Fill "preparedStatement". 
            int i = 1;
            preparedStatement.setString(i++,"LISTO");
            preparedStatement.setInt(i++,detallesTO.getIdPedido());
            
             Execute query. 
            int updatedRows = preparedStatement.executeUpdate();

            if (updatedRows == 0) {
                throw new InstanceNotFoundException(
                    detallesTO.getIdPedido(), 
                    DetallesPedidoTO.class.getName());
            }

            if (updatedRows > 1) {
                throw new SQLException("Duplicate row for identifier = '" + 
                    detallesTO.getIdPedido() + "' in table 'DETALLESPEDIDO'");
            }        
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeStatement(preparedStatement);
        }    
        
    }
    
    
    
    */
    

    public List findPendientes(Connection connection) 
    throws InternalErrorException {
    
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    List<Integer> listaIdPedidos = new ArrayList<Integer>(); 
    
    try {
            

        /* Create "preparedStatement" para devolver la lista de idPedidos pendientes. */
        String queryString = "SELECT IDPEDIDO FROM DETALLESPEDIDO WHERE ESTADO = 'PENDIENTE' ORDER BY FECHA";
        preparedStatement = connection.prepareStatement(queryString);    
        
        /* Execute query. */
		resultSet = preparedStatement.executeQuery();

        if (!resultSet.next()) {
            throw new InternalErrorException(new SQLException(
                "No hay ningun detalle de pedido con ese identificador."));
        }
        int contador = 0;
        int idPedido;
        do {
           		idPedido= resultSet.getInt(1);
         		
           		listaIdPedidos.add(idPedido);

           		contador++;
        } while (resultSet.next()) ;
            
		/* get result */
        
		return listaIdPedidos;
    
    } catch (SQLException e) {
        throw new InternalErrorException(e);
    } finally {
        GeneralOperations.closeStatement(preparedStatement);
		GeneralOperations.closeResultSet(resultSet);
    }
    
}

    /* actualiza el estado del pedido a LISTO si todas sus lineas estan PREPARADAS */

    public void actualizaEstado(Connection conexion, int idPedido) 
        throws InternalErrorException, InstanceNotFoundException {
        

        
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            
            /* Create "preparedStatement". */
   
            String queryString = "SELECT ESTADO FROM LINEAPEDIDO" + " WHERE IDPEDIDO = ?";
            preparedStatement = conexion.prepareStatement(queryString);

        	
            /* Fill "preparedStatement". */
            int i = 1;
            preparedStatement.setInt(i++, idPedido);
            
                                
            /* Execute query. */
            resultSet = preparedStatement.executeQuery();

            /* Read objects. */
            List<String> estados = new ArrayList<String>();
            int contador = 0;
            String estado;
            
        	    do {

                	resultSet.next();
             		estado= resultSet.getString(1);
             	
        			estados.add(estado);

					contador++;

                
                } while (!resultSet.isLast()) ;
                
                int pos=0;
                estado="LISTO";
                do{
                	if (estados.get(pos).equals("PENDIENTE")){

                		estado="PENDIENTE";
                	}
                	pos++;
                } while (pos<estados.size());
                	
                
             String queryString2 = "UPDATE DETALLESPEDIDO" +
                " SET ESTADO = ? WHERE IDPEDIDO = ?";
            preparedStatement = conexion.prepareStatement(queryString2);
            
            preparedStatement.setString(1,estado);
            preparedStatement.setInt(2,idPedido);
             
            int updatedRows = preparedStatement.executeUpdate();

            if (updatedRows == 0) {
                throw new InstanceNotFoundException(idPedido,null);
            }

            if (updatedRows > 1) {
                throw new SQLException("Duplicate row for identifier = '" + 
                    idPedido + "' in table 'DETALLESPEDIDO'");
            }        
            
        } catch (SQLException e) {
            throw new InternalErrorException(e);    
        } finally {
            GeneralOperations.closeResultSet(resultSet);
            GeneralOperations.closeStatement(preparedStatement);
        }
        
    }

    
    /* This class can by tested by "SQLAccountDAOFactory". */

}
